package com.free.ext.web.spring.messageconveter;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.io.IOException;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class JsonHttpMessageConverter extends MappingJackson2HttpMessageConverter {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/
    public JsonHttpMessageConverter(){
        this.setObjectMapper(new JsonObjectMapper());
    }
    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    public static class JsonObjectMapper extends ObjectMapper{
        public JsonObjectMapper()
        {
            SimpleModule module = new SimpleModule();
            JsonHtmlSerizlizer jsonSerizlizer = new JsonHtmlSerizlizer();
            module.addSerializer(jsonSerizlizer);
            this.registerModule(module);
            this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        }
    }

    private static class JsonHtmlSerizlizer extends JsonSerializer<String>
    {

        public Class<String> handledType() { return String.class; }

        @Override
        public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException
        {
            if(!value.startsWith("http"))
            {
                value = StringEscapeUtils.escapeHtml4(value);
            }
            generator.writeString(value);
        }
    }

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
